package modulo;

import java.awt.Graphics;

import grafica.BarraEnergia;
import grafica.ColoriGiocatori;
import grafica.Drawable;
import grafica.GiocatoreVista;
import grafica.Grafica;
import grafica.RettangoloBase;

public class ListaGiocatori implements Drawable,InterfacciaListaGiocatori{
	
	
	private Giocatore[] giocatori;
	private Grafica grafica;
	private int mode;
	/**
	 * @return the tipoGrafica
	 */
	public Grafica getGrafica() {
		return grafica;
	}
	/**
	 * @param tipoGrafica the tipoGrafica to set
	 */
	public void setGrafica(Grafica tipoGrafica) {
		this.grafica = tipoGrafica;
	}
	/**
	 * @return the modalità
	 */
	public int getModalita() {
		return mode;
	}
	/**
	 * @param modalità the modalità to set
	 */
	public void setMode(int modalita) {
		this.mode= modalita;
	}
	public ListaGiocatori(int n) {
		giocatori=new Giocatore[n];
	}
	
	/**
	 * @return the giocatori
	 */
	public Giocatore[] getElencoGiocatori() {
		return giocatori;
	}
	/**
	 * @param giocatori the giocatori to set
	 */
	public void setElencoGiocatori(Giocatore[] giocatori) {
		this.giocatori = giocatori;
	}
	
	/* La Grafica non dovrebbe essere separata dal Modello?
	 * il Prof
	 */
	@Override
	public void draw(Graphics oggetto) {
		
		/* Nota: bene l'interfacciamento a 'tipoGrafica' per astrarre su
		 * come ogni singolo elemento � disegnato.
		 * Questa funzione draw, fatta cos�, tra le altre cose implementa un Design Pattern 'Template Method'
		 * Tuttavia: in questo modo vi vincolate a seguire sempre lo stesso template 
		 * per disegnare lo scenario, sempre la stessa struttura. A seconda delle esigenze
		 * grafiche, questo potrebbe talvolta non essere la soluzione migliore.
		 * il Prof
		 */
		GiocatoreVista disegnaGiocatore=grafica.getTipoVistaGiocatore();
		BarraEnergia disegnaBarraEnergica=grafica.getTipologiaBarraEnergia();
		ColoriGiocatori colori=grafica.getColori();
		for (int i = 0; i < giocatori.length; i++) {
				Giocatore giocatorei=giocatori[i];
				
				
				if(mode==MODE_TUTTI_CONTRO_TUTTI){
					/* la costante � sicuramente meglio di un numero.
					 * Ma cosa succede se aumenta il numero delle possibili modalit�
					 * di gioco?
					 * il Prof
					 */
					disegnaGiocatore.setColore(colori.get(giocatorei.getSquadra()));
				}else{
				disegnaGiocatore.setColore(colori.get(giocatorei.getSquadra()));
				}
				disegnaGiocatore.setIstanza(giocatorei);
				if(giocatorei.isVivo()){
						disegnaGiocatore.draw(oggetto);
						disegnaBarraEnergica.setBarraGiocatore(giocatorei);
						disegnaBarraEnergica.draw(oggetto);
				}
			
		}
	}
	
	
	public boolean controlloPosizioneValida(RettangoloBase istanza){
		GiocatoreVista vista=grafica.getTipoVistaGiocatore();
		for (int j = 1; j < giocatori.length; j++) {
			vista.setIstanza(giocatori[j]);
			if(vista.intersezioneRettangolo(istanza)&&giocatori[j].isVivo()){
				return false;
			}	
		}
		return true;
	}
	
}
